A computer system includes an operating system whose primary function is the management of hardware and software resources in the computer system. The operating system handles input/output (I/O) requests from software processes or applications to exchange data with on-line external storage devices in a storage subsystem. The applications address those storage devices in terms of the names of files which contain the information to be sent to or retrieved from the applications. A file system, which is a component of the operating system, translates the file names into logical addresses in the storage subsystem. The file system forwards the (I/O) requests to an I/O subsystem which, in turn, converts the logical addresses into physical locations in the storage devices and commands the latter devices to engage in the requested storage or retrieval operations.
The on-line storage devices on a computer are configured from one or more disks into logical units of storage space referred to herein as "containers." Examples of containers include volume sets, stripe sets, mirror sets, and various Redundant Array of Independent Disk (RAID) implementations. A volume set comprises one or more physical partitions, i.e., collections of blocks of contiguous space on disks, and is composed of space on one or more disks. Data is stored in a volume set by filling all of the volume's partitions in one disk drive before using volume partitions in another disk drive. A stripe set is a series of partitions on multiple disks, one partition per disk, that is combined into a single logical volume. Data stored in a stripe set is evenly distributed among the disk drives in the stripe set. A mirror set is composed of volumes on multiple disks, whereby a volume on one disk is a duplicate copy of an equal sized volume on another disk in order to provide data redundancy. A RAID implementation is a collection of partitions, where each partition is composed of space from more than one disk in order to support data redundancy.
In a prior system, the I/O subsystem configures the containers through a software entity called a "container manager." Essentially the container manager sets up a mapping structure to efficiently map logical addresses received from the file system to physical addresses on storage devices. The I/O subsystem also includes a software driver for each type of container configuration on the system. These drivers use the mapping structure to derive the physical addresses, which they then pass to the prospective storage devices for storage and retrieval operations.
Specifically, when the computer system is initially organized, the (I/O) subsystem's container manager configures the containers and maintains the configuration tables in a container layer of the I/O subsystem. In accordance with a copending U.S. patent application, Ser. No. 08/964,304 titled, File Array Storage Architecture by Richard Napolitano et al., the container layer of the I/O subsystem comprises a Device Switch Table, a Container Array, and a Partition Table. The Device Switch Table consists of entries, each of which ordinarily points to the entry point of a container driver that performs I/O operations on a particular type of container. The Container Array is a table of entries, each of which ordinarily points to data structures used by a container driver. There is a fixed one-to-one relationship between the Device Switch Table and the Container Array. The Partition Table contains partition structures copied from disk drives for each container on the system. Each Partition Table entry points to one physical disk drive and allows the container driver to access physical location in the on-line storage devices.
When a software process issues an I/O request, the file system accepts the file-oriented I/O request and translates it into an I/O request bound for a particular device. The file system sends the I/O request which includes, inter alia, a block number for the first block of data requested by the application and also a pointer to a Device Switch Table entry which points to a container driver for the container where the requested data is stored. The container driver accesses the Container Array entry for pointers to the data structures used in that container and to Partition Table entries for that container. Based on the information in the data structures, the container driver also accesses Partition Table entries to obtain the starting physical locations of the container on the storage devices. Based on the structures pointed to by the Container Array entry and partition structures in the Partition Table, the container driver sends the I/O request to the appropriate disk drivers for access to the disk drives.
In the container configuration described above, by building the Partition Table entry for each container, the system configures each container to directly access physical disks drives. This type of container configuration is acceptable in single-level container structure where all containers directly access disk drives. However, in multi-level container structures where higher-level or secondary containers access disk drives through lower level or primary containers, this type of container configuration is unacceptable. For multi-level container structures, in the above-described configuration, each secondary container driver must have specific knowledge of the type primary containers in the container structure and how the primary containers access physical disk drives. This causes the system to use a different method for configuring multi-level containers than it does for single-level containers and it also causes the system to tailor secondary container drivers to the container structure being implemented. Such tailoring of secondary container drivers leads to process redundancy and it becomes difficult to maintain and upgrade such drivers during software development. Therefore, it is an object of the present invention to provide a method for configuring multi-level containers which is the same as the method for configuring single-level containers whereby, the system creates drivers for secondary containers without specific knowledge of the types and functions of primary containers in the container structure.
Yet another object of the present invention is to provide a method of routing processing (I/O) requests in the secondary containers to primary containers that have direct access to physical storage devices on which the I/O requests are stored.